home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE4b.s < prev    next >
Text File  |  1994-10-30  |  9KB  |  240 lines

  1.  
  2. ; Lezione4b.s    VISUALIZZAZIONE DI UNA FIGURA IN 320*256 a 3 plane (8 colori)
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;*****************************************************************************
  16. ;    FACCIAMO PUNTARE I BPLPOINTERS NELLA COPPELIST AI NOSTRI BITPLANES
  17. ;*****************************************************************************
  18.  
  19.  
  20.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  21.                 ; ossia dove inizia il primo bitplane
  22.  
  23.     LEA    BPLPOINTERS,A1    ; in a1 mettiamo l'indirizzo dei
  24.                 ; puntatori ai planes della COPPERLIST
  25.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  26.                 ; per eseguire il ciclo col DBRA
  27. POINTBP:
  28.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  29.                 ; nella word giusta nella copperlist
  30.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  31.                 ; mettendo la word ALTA al posto di quella
  32.                 ; BASSA, permettendone la copia col move.w!!
  33.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  34.                 ; nella word giusta nella copperlist
  35.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  36.                 ; rimettendo a posto l'indirizzo.
  37.     ADD.L    #40*256,d0    ; Aggiungiamo 10240 ad D0, facendolo puntare
  38.                 ; al secondo bitplane (si trova dopo il primo)
  39.                 ; (cioe' aggiungiamo la lunghezza di un plane)
  40.                 ; Nei cicli seguenti al primo faremo puntare
  41.                 ; al terzo, al quarto bitplane eccetera.
  42.  
  43.     addq.w    #8,a1        ; a1 ora contiene l'indirizzo dei prossimi
  44.                 ; bplpointers nella copperlist da scrivere.
  45.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  46.  
  47. ;
  48.  
  49.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  50.     move.w    d0,$dff088        ; Facciamo partire la COP
  51.  
  52.     move.w    #0,$dff1fc        ; FMODE - Disattiva l'AGA
  53.     move.w    #$c00,$dff106        ; BPLCON3 - Disattiva l'AGA
  54.  
  55. mouse:
  56.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  57.     bne.s    mouse        ; se no, torna a mouse:
  58.  
  59.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  60.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  64.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  65.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  66.     rts            ; USCITA DAL PROGRAMMA
  67.  
  68. ;    Dati
  69.  
  70. GfxName:
  71.     dc.b    "graphics.library",0,0    
  72.  
  73. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  74.     dc.l    0    ; della graphics.library
  75.  
  76. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  77.     dc.l    0
  78.  
  79.     SECTION    GRAPHIC,DATA_C
  80.  
  81. COPPERLIST:
  82.  
  83.     ; Facciamo puntare gli sprite a ZERO, per eliminarli, o ce li troviamo
  84.     ; in giro impazziti a disturbare!!!
  85.  
  86.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000
  87.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  88.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  89.     dc.w    $13e,$0000
  90.  
  91.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  92.     dc.w    $90,$2cc1    ; DiwStop
  93.     dc.w    $92,$0038    ; DdfStart
  94.     dc.w    $94,$00d0    ; DdfStop
  95.     dc.w    $102,0        ; BplCon1
  96.     dc.w    $104,0        ; BplCon2
  97.     dc.w    $108,0        ; Bpl1Mod
  98.     dc.w    $10a,0        ; Bpl2Mod
  99.  
  100. ; il BPLCON0 ($dff100) Per uno schermo a 3 bitplanes: (8 colori)
  101.  
  102.             ; 5432109876543210
  103.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  104.  
  105. ;    Facciamo puntare i bitplanes direttamente mettendo nella copperlist
  106. ;    i registri $dff0e0 e seguenti qua di seguito con gli indirizzi
  107. ;    dei bitplanes che saranno messi dalla routine POINTBP
  108.  
  109. BPLPOINTERS:
  110.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane - BPL0PT
  111.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane - BPL1PT
  112.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane - BPL2PT
  113.  
  114. ;    Gli 8 colori della figura sono definiti qui:
  115.  
  116.     dc.w    $0180,$000    ; color0
  117.     dc.w    $0182,$475    ; color1
  118.     dc.w    $0184,$fff    ; color2
  119.     dc.w    $0186,$ccc    ; color3
  120.     dc.w    $0188,$999    ; color4
  121.     dc.w    $018a,$232    ; color5
  122.     dc.w    $018c,$777    ; color6
  123.     dc.w    $018e,$444    ; color7
  124.  
  125. ;    Inserite qua eventuali effetti coi WAIT
  126.  
  127.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  128.  
  129.  
  130. ;    Ricordatevi di selezionare la directory dove si trova la figura
  131. ;    in questo caso basta scrivere: "V df0:SORGENTI2"
  132.  
  133.  
  134. PIC:
  135.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  136.                     ; convertita col KEFCON, fatta di
  137.                     ; 3 bitplanes consecutivi
  138.  
  139.     end
  140.  
  141. Come avrete visto non ci sono routine sincronizzate in questo esempio, ma
  142. solo le routine che puntano i bitplane e la copperlist.
  143. Innanzitutto provate a eliminare con dei ; i puntatori degli sprite:
  144.  
  145. ;    dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000
  146. ;    dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  147. ;    dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  148. ;    dc.w    $13e,$0000
  149.  
  150. Noterete che ogni tanto passano come delle STRISCIATE, quelli sono sprite
  151. senza controllo all'impazzata. Impareremo a domarli piu' avanti.
  152.  
  153. Provate ora ad aggiungere prima della fine della copperlist qualche WAIT,
  154. e noterete come siano utili i WAIT+COLOR per AGGIUNGERE SFUMATURE ORIZZONTALI
  155. o CAMBIARE COLORI totalmente GRATIS, ossia, con una figura a 8 colori come
  156. questa possiamo lavorare con MOVE+WAIT facendogli uno sfondo con un centinaio
  157. di colori sfumandoli, oppure cambiando anche i colori "in sovraimpressione",
  158. ossia il $182, $184, $186, $188, $18a, $18c, $18e.
  159.  
  160. Come primo 'abbellimento' copiate e inserite questo pezzo prefabbricato di
  161. sfumatura tra i colori e la fine della copperlist: (dc.w $FFFF,$FFFE)
  162. RICORDO CHE BISOGNA SELEZIONARE IL BLOCCO CON Amiga+b, Amiga+c, poi
  163. posizionare il cursore dove si vuole copiare il testo, e inserirlo con Amiga+i.
  164.  
  165.  
  166.     dc.w    $a907,$FFFE    ; Aspetto la linea $a9
  167.     dc.w    $180,$001    ; blu scurissimo
  168.     dc.w    $aa07,$FFFE    ; linea $aa
  169.     dc.w    $180,$002    ; blu un po' piu' intenso
  170.     dc.w    $ab07,$FFFE    ; linea $ab
  171.     dc.w    $180,$003    ; blu piu' chiaro
  172.     dc.w    $ac07,$FFFE    ; prossima linea
  173.     dc.w    $180,$004    ; blu piu' chiaro
  174.     dc.w    $ad07,$FFFE    ; prossima linea
  175.     dc.w    $180,$005    ; blu piu' chiaro
  176.     dc.w    $ae07,$FFFE    ; prossima linea
  177.     dc.w    $180,$006    ; blu a 6
  178.     dc.w    $b007,$FFFE    ; salto 2 linee
  179.     dc.w    $180,$007    ; blu a 7
  180.     dc.w    $b207,$FFFE    ; sato 2 linee
  181.     dc.w    $180,$008    ; blu a 8
  182.     dc.w    $b507,$FFFE    ; salto 3 linee
  183.     dc.w    $180,$009    ; blu a 9
  184.     dc.w    $b807,$FFFE    ; salto 3 linee
  185.     dc.w    $180,$00a    ; blu a 10
  186.     dc.w    $bb07,$FFFE    ; salto 3 linee
  187.     dc.w    $180,$00b    ; blu a 11
  188.     dc.w    $be07,$FFFE    ; salto 3 linee
  189.     dc.w    $180,$00c    ; blu a 12
  190.     dc.w    $c207,$FFFE    ; salto 4 linee
  191.     dc.w    $180,$00d    ; blu a 13
  192.     dc.w    $c707,$FFFE    ; salto 7 linee
  193.     dc.w    $180,$00e    ; blu a 14
  194.     dc.w    $ce07,$FFFE    ; salto 6 linee
  195.     dc.w    $180,$00f    ; blu a 15
  196.     dc.w    $d807,$FFFE    ; salto 10 linee
  197.     dc.w    $180,$11F    ; schiarisco...
  198.     dc.w    $e807,$FFFE    ; salto 16 linee
  199.     dc.w    $180,$22F    ; schiarisco...
  200.     dc.w    $ffdf,$FFFE    ; FINE ZONA NTSC (linea $FF)
  201.     dc.w    $180,$33F    ; schiarisco...
  202.     dc.w    $2007,$FFFE    ; linea $20+$FF = linea $1ff (287)
  203.     dc.w    $180,$44F    ; schiarisco...
  204.  
  205. Abbiamo creato dal nulla, senza effetti controproducenti, una sfumatura
  206. portando i colori effettivi sullo schermo da 8 a 27!!!!
  207. Aggiungiamo altri 7 colori, questa volta cambiando non il colore di sfondo,
  208. il $dff180, ma gli altri 7 colori: inserite questo pezzo di copperlist tra
  209. i puntatori dei bitplane e i colori: (lasciate pure l'altra modifica)
  210.  
  211.     dc.w    $0180,$000    ; color0
  212.     dc.w    $0182,$550    ; color1    ; ridefiniamo il colore della
  213.     dc.w    $0184,$ff0    ; color2    ; scritta COMMODORE! GIALLA!
  214.     dc.w    $0186,$cc0    ; color3
  215.     dc.w    $0188,$990    ; color4
  216.     dc.w    $018a,$220    ; color5
  217.     dc.w    $018c,$770    ; color6
  218.     dc.w    $018e,$440    ; color7
  219.  
  220.     dc.w    $7007,$fffe    ; Aspettiamo la fine della scritta COMMODORE
  221.  
  222. Con 45 "dc.w" aggiunti alla copperlist abbiamo trasformato un'innoqua PIC di
  223. soli 8 colori in una PIC a 34 colori, superando anche il limite dei 32 colori
  224. delle pic a 5 bitplanes!!!
  225.  
  226. Solo programmando le copperlist in assembler si puo' sfruttare al massimo
  227. la grafica di Amiga: ora potreste anche fare delle figure a 320 colori
  228. puliti puliti semplicemente cambiando l'intera palette di una figura a 32
  229. colori 10 volte, mettendo un wait+palette ogni 25 linee...
  230. Ora forse vi spiegherete come mai certi giochi hanno 64, 128 o piu' colori
  231. sullo schermo!!! Hanno delle copperlist lunghissime dove cambiano colore
  232. a diverse altezze del video!
  233.  
  234. Fatevi un po' di modifiche, che fanno sempre bene, e se vi va provate a
  235. mettere in "sottofondo" gli esempi con le barrette della Lezione3, basta
  236. caricarseli in altri buffer e inserire i pezzi di routine e di copperlist
  237. giusti, e' un buon allenamento. Provate a far camminare la barretta "sotto"
  238. il disegno, se ci riuscite siete tosti.
  239.  
  240.